﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Web.Security;
using BIZMA.BL.Security;

namespace BIZMA._controls.Users
{
    public partial class List_Groups : BIZListControl, IBIZControlDefaultMethods
    {
        #region Default
        public void DefaultListLoad()
        {
            LoadGroups();
        }

        public void DefaultListLoad(Guid Id, string loadByType)
        {
            if (loadByType.ToUpper() == LoadByTypeUser)
            {
                LoadByUser(Id);
            }
            else
            {
                throw new NotImplementedException();
            }
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew(Guid Id, string editByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditLoad(Guid Id)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Load the users usergroups
        /// </summary>
        public const string LoadByTypeUser = "USER";
        #endregion



        private bool CanAddGroupPopup { get { return ViewState["CanAddGroupPopup"] != null ? (bool)ViewState["CanAddGroupPopup"] : false; } set { ViewState["CanAddGroupPopup"] = value; } }

        //OLIKA ID properties som styr frågan för listan tex om man ska hämta utifrån EmployeeId eller PlanningId
        //Styrs av publika metoder
        private Guid UserId { get { return ViewState["UserId"] != null ? (Guid)ViewState["UserId"] : Guid.Empty; } set { ViewState["UserId"] = value; } }
         public bool SystemGroupsPermission { get { return ViewState["SystemGroupsPermission"] != null ? (bool)ViewState["SystemGroupsPermission"] : false; } set { ViewState["SystemGroupsPermission"] = value; } }

        //Olika filter för frågan till listan kan tex vara om man ska visa alla eller aktiva, eller datum mmm
        //Filter sätter man innan man kör de publika metorder som sätter ID properties som finns ovan
        /// <summary>
        /// Sök efter användare som innehåller detta
        /// </summary>
        public string FilterBy_Name { get { return ViewState["FilterBy_Name"] != null ? (string)ViewState["FilterBy_Name"] : ""; } set { ViewState["FilterBy_Name"] = value; } }
        public string FilterBy_GroupType { get { return ViewState["FilterBy_GroupType"] != null ? (string)ViewState["FilterBy_GroupType"] : ""; } set { ViewState["FilterBy_GroupType"] = value; } }



        #region This dialog
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected override void OnInit(EventArgs e)
        {
            base.ActionDropDown = ddlAction;
            base.ListControl = lv;

            base.OnInit(e);

            base.NeedsData += new NeedsDataHandler(List_Users_NeedsData);

            //här gör man alla init inställningar typ lägga till eventhandlers och annat som styr sidan

            if (ContainerControl != null)
            {
                ContainerControl.Title = "Användargrupper";
                ContainerControl.ShowButtons(false, false, false, false);

                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 800;
                    ModalContainerControl.Height = 500;
                }
            }

            CanAddGroupPopup = mcGroup.CanAddPopupControl(BIZControl.Group);
            BaseBL.BtnOpenEnabled(btnNew, CanAddGroupPopup, ViewState);
            mcGroup.ModalClosing += new ModalControlClosing(mcGroup_ModalClosing);

            ListDataBound += new EventHandler<ListViewItemEventArgs>(List_ListDataBound);
        }


        void mcGroup_ModalClosing(object sender, EventArgs e)
        {
            LoadList(false);
        }

        void List_Users_NeedsData(bool sorting)
        {
            LoadList(sorting);
        }


        private void FillActionList()
        {
            ddlAction.Items.Add(new ListItem("--Välj åtgärd--", "-"));
            if (PickerControl)
            {
                ddlAction.Items.Add(new ListItem("Välj", "SEL"));
                ddlAction.Items.Add(new ListItem("-------", "-"));
                ddlAction.SelectedValue = "SEL";
            }
            ddlAction.Items.Add(new ListItem("Radera", "DEL"));

        }

        #endregion
        #region list

        /// <summary>
        /// Här rensas alla id properties som används för frågan till listan
        /// </summary>
        private void ResetIdProperties()
        {
            UserId = Guid.Empty;

            lv.DataSource = null;
            lv.DataBind();
        }

        //Publika metoder som underliggande sida/kontroll kan ropa på för att ladda kontrollen
        public void LoadGroups()
        {
            ResetIdProperties();
            CheckPermissionAndLoad();

        }

        public void LoadByUser(Guid userId)
        {
            ResetIdProperties();
            UserId = userId;
            CheckPermissionAndLoad();
        }

        private void CheckPermissionAndLoad()
        {
            if (SecurityBL.HasSysFunction(SecurityBL.SYSFUNCTION_SYSTEM_USERGROUPS) == false)
            {
                throw new AccessViolationException("Du har inte rättigheter att admninistrera grupper");
            }
            
            SystemGroupsPermission = SecurityBL.HasSysFunction(SecurityBL.SYSFUNCTION_SYSTEM_SYSTEMGROUPS);



            LoadList(true);
        }

        /// <summary>
        /// Metod som ansvarar för att fylla listan med värden utifrån vilken publik load metod som körts innan
        /// </summary>
        /// <param name="sorting">Talar om ifall sortering ska ändras eller om man ska använda tidigare sortering</param>
        private void LoadList(bool sorting)
        {
            if (!InitLoaded)
            {
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                InitLoaded = true;
                FillActionList();
            }


            BIZMAEntities ent = BaseBL.GetEnt();
            IQueryable<BIZModel.UserGroup> query = ent.UserGroups;

            if (UserId != Guid.Empty)
            {
                query = ent.UserProfiles.FirstOrDefault(q => q.UserId == UserId).UserGroups.AsQueryable();   
            }

            if (query != null)
            {
                if (FilterBy_Name != "")
                {
                    query = query.Where(q => q.Name.Contains(FilterBy_Name));
                }

                if (FilterBy_GroupType != "")
                {
                    if (FilterBy_GroupType == "1")
                    {
                        query = query.Where(q => q.IsSystemGroup == true);
                    }
                    else
                    {
                        query = query.Where(q => q.IsSystemGroup == false);
                    }                                       
                }

                //om man inte har rättigheter till systemgrupper så ska de inte visas (men om man ser sina grupper så ska man se om man är med i någon systemgrupp (se listbound))
                if (UserId == Guid.Empty && SystemGroupsPermission == false)
                {
                    query = query.Where(q => q.IsSystemGroup == false);
                    query = query.Where(q => q.IsSA == false);
                }

            }

            lv.DataSource = (from BIZModel.UserGroup G in query
                             select new
                             {
                                 G.UserGroupId,
                                 G.Name,
                                 G.IsSystemGroup
                             });

            lv.DataBind();

            if (!sorting)
                lv.ReSort(ViewState);
        }

        void List_ListDataBound(object sender, ListViewItemEventArgs e)
        {
            //göm alla funktioner för systemgrupper om man inte har rättigheter att administrera det
            if (SystemGroupsPermission == false && ((bool)DataBinder.Eval(e.Item.DataItem, "IsSystemGroup")) == true)
            {

                Control chkSel = (LinkButton)e.Item.FindControl("chkSel");
                Control btnSel = (LinkButton)e.Item.FindControl("btnSel");
                LinkButton lkb1 = (LinkButton)e.Item.FindControl("lkb1");
                LinkButton lkb2 = (LinkButton)e.Item.FindControl("lkb2");

                chkSel.Visible = false;
                btnSel.Visible = false;
                lkb1.Enabled = false;
                lkb2.Enabled = false;

                lkb1.ToolTip = "Du har inte behörighet till systemgrupper";
                lkb2.ToolTip = lkb1.ToolTip;
            }
           
        }

        #endregion

        #region detail dialog
        protected void OpenDetail_Command(object sender, CommandEventArgs e)
        {
            if (HandleListClickEvents)
            {
                CallHandleClick(this, Guid.Parse(e.CommandArgument.ToString()), null);
            }
            else
            {
                if (CanAddGroupPopup)
                {
                    mcGroup.AddDefaultEditLoad(BIZControl.Group, Guid.Parse(e.CommandArgument.ToString()));
                }
            }

        }

        protected void btnNew_Command(object sender, CommandEventArgs e)
        {
            if (HandleNewClickEvent)
            {
                CallNewHandleClick(this, Guid.Empty, null);
            }
            else
            {
                if (CanAddGroupPopup)
                {
                    mcGroup.AddDefaultEditNew(BIZControl.Group);
                }
            }
        }

        #endregion
        /// <summary>
        /// Event  när man har knappar för att välja en rad i listan
        /// </summary>
        /// <param name="sender">Knappen som klickats</param>
        /// <param name="e">Knappens CommandEventArgs</param>
        protected void btnSel_Command(object sender, CommandEventArgs e)
        {
            SelectedItems = new List<Guid>();
            SelectedItems.Add(Guid.Parse(e.CommandArgument.ToString()));

            CallListSelect(this, null, MultipleSelect, SelectedItems);

        }
        /// <summary>
        /// Event när man har valt en/flera rader i listan och väljer att utföra något från åtgärdslistan tex (Välj eller radera) 
        /// </summary>
        /// <param name="sender">Knappen utför</param>
        /// <param name="e">EventArgs. Används inte det är vad man valt i ddlAction som är intressant</param>
        protected void btnAction_Click(object sender, EventArgs e)
        {
            if (ddlAction.SelectedValue != "-")
            {
                if (ddlAction.SelectedValue == "SEL")
                {
                    var selectedKeys = lv.GetSelectedDataKeys("chkSel");
                    SelectedItems = new List<Guid>();
                    foreach (DataKey dk in selectedKeys)
                    {
                        Guid contactId = Guid.Parse(dk.Value.ToString());
                        SelectedItems.Add(contactId);
                    }

                    CallListSelect(this, null, MultipleSelect, SelectedItems);
                }
                else
                {

                    var selectedKeys = lv.GetSelectedDataKeys("chkSel");
                    BIZMAEntities ent = BaseBL.GetEnt();

                    if (ddlAction.SelectedValue == "DEL")
                    {
                        foreach (DataKey dk in selectedKeys)
                        {

                            Guid GroupId = Guid.Parse(dk.Value.ToString());
                            UserGroup UG = ent.UserGroups.FirstOrDefault(q => q.UserGroupId == GroupId);

                            ent.DeleteObject(UG);

                        }
                    }

                    ent.SaveChanges();
                }
            }


            if (ddlAction.SelectedValue != "SEL")
            {
                LoadList(false);
            }

        }

        /// <summary>
        /// Event för klick på sökfunktionen
        /// </summary>
        /// <param name="sender">Knappen</param>
        /// <param name="e">Knappens EventArgs</param>
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            FilterBy_Name = searchName.Text;
            FilterBy_GroupType = searchGroupType.SelectedValue;

            LoadList(true);
        }


    }
}